c++ - C 和 C++ 中 union 的用途
全部标签 我是C的新手,我遇到了这样的代码:intn[10];if(c>='0'&&c在if循环中为什么我们必须在0周围使用单引号,它有什么用,为什么我们不能定义0立即作为整数?而在第二行代码++n[c-'0']中,这样使用数组有什么用,从某种意义上说我们需要减去0(再次为什么在这种情况下使用单引号?)来自c的数组索引?如果我喜欢这个n[c-'0'],索引操作的结果(c-'0')会是一个字符还是整数?鉴于有人可以说我,这种数组的真正用途是什么,有什么缺点?提前致谢。 最佳答案 在C中,'0'是一个整数,其值将数字零表示为一个字符,而不是值0,
在fedora-linux上使用gcc4.8.2和llvm/clang3.4将我的代码编译为C++11,我得到了我无法真正理解的奇怪结果解释...这是一个类似的程序fedora。#includeusingnamespacestd;structA{};structC{};structB1:A{union{Aa;};};structB2:A{union{Cc;};};intmain(){coutsizeof(B1)=2和sizeof(B2)=1但是为什么尺寸不同?其实我有一个“为什么”的想法,但我想找到确切的解释或C++规则。 最佳答案
在fedora-linux上使用gcc4.8.2和llvm/clang3.4将我的代码编译为C++11,我得到了我无法真正理解的奇怪结果解释...这是一个类似的程序fedora。#includeusingnamespacestd;structA{};structC{};structB1:A{union{Aa;};};structB2:A{union{Cc;};};intmain(){coutsizeof(B1)=2和sizeof(B2)=1但是为什么尺寸不同?其实我有一个“为什么”的想法,但我想找到确切的解释或C++规则。 最佳答案
起初我认为它可以用于性能测量。但它是saidstd::chrono::high_resolution_clock可能不稳定(is_steady可能是false)。也有人说std::chrono::high_resolution_clock甚至可能是std::chrono::system_clock的别名,一般来说是不稳定的。所以我不能用这种类型的时钟测量时间间隔,因为任何时候时钟都可能被调整,我的测量结果会出错。同时我无法将std::chrono::high_resolution_clock的时间点转换为日历时间,因为它没有to_time_t方法。所以我也不能用这种类型的时钟获得实时。
起初我认为它可以用于性能测量。但它是saidstd::chrono::high_resolution_clock可能不稳定(is_steady可能是false)。也有人说std::chrono::high_resolution_clock甚至可能是std::chrono::system_clock的别名,一般来说是不稳定的。所以我不能用这种类型的时钟测量时间间隔,因为任何时候时钟都可能被调整,我的测量结果会出错。同时我无法将std::chrono::high_resolution_clock的时间点转换为日历时间,因为它没有to_time_t方法。所以我也不能用这种类型的时钟获得实时。
我想知道c/c++中的BoostVariant和union数据类型之间有什么区别。我知道union数据类型占用相同的内存位置,并且内存区域中最大的数据类型占用使用的内存总量,例如unionspace{charCHAR;floatFLOAT;intINTEGER;}S;应该占用4个字节的内存,因为int和float是最大且相等的大小。BoostVariant和union数据类型在其他方面是否有相同点和不同点?我也知道BoostVariant可以采用任何数据类型,并且它允许数据类型“多态性”(如果我误用了OOP主题词,请纠正我)。因此,union数据类型也是一种多态性吗?
我想知道c/c++中的BoostVariant和union数据类型之间有什么区别。我知道union数据类型占用相同的内存位置,并且内存区域中最大的数据类型占用使用的内存总量,例如unionspace{charCHAR;floatFLOAT;intINTEGER;}S;应该占用4个字节的内存,因为int和float是最大且相等的大小。BoostVariant和union数据类型在其他方面是否有相同点和不同点?我也知道BoostVariant可以采用任何数据类型,并且它允许数据类型“多态性”(如果我误用了OOP主题词,请纠正我)。因此,union数据类型也是一种多态性吗?
我有一个带有公开面向结构A和内部结构B的API,并且需要能够将结构B转换为结构A。以下代码是否合法和明确定义的行为C99(和VS2010/C89)和C++03/C++11?如果是,请解释是什么使它定义明确。如果不是,那么在两个结构之间进行转换的最有效和跨平台的方法是什么?structA{uint32_tx;uint32_ty;uint32_tz;};structB{uint32_tx;uint32_ty;uint32_tz;uint64_tc;};unionU{structAa;structBb;};intmain(intargc,char*argv[]){Uu;u.b.x=1;u.b
我有一个带有公开面向结构A和内部结构B的API,并且需要能够将结构B转换为结构A。以下代码是否合法和明确定义的行为C99(和VS2010/C89)和C++03/C++11?如果是,请解释是什么使它定义明确。如果不是,那么在两个结构之间进行转换的最有效和跨平台的方法是什么?structA{uint32_tx;uint32_ty;uint32_tz;};structB{uint32_tx;uint32_ty;uint32_tz;uint64_tc;};unionU{structAa;structBb;};intmain(intargc,char*argv[]){Uu;u.b.x=1;u.b
我无法理解使用带有GCC的union可以做什么和不可以做什么。我阅读了有关它的问题(特别是here和here),但它们关注的是C++标准,我觉得C++标准和实践(常用的编译器)之间存在不匹配。特别是,我最近在GCConlinedoc中发现了令人困惑的信息。在阅读编译标志-fstrict-aliasing时。它说:-fstrict-aliasingAllowthecompilertoassumethestrictestaliasingrulesapplicabletothelanguagebeingcompiled.ForC(andC++),thisactivatesoptimizati